package controller

import (
	"goscan-mgt/model"
	"goscan-mgt/service"
	"goscan-mgt/utils"
	"log"
	"net/http"
	"strconv"

	"github.com/gin-gonic/gin"
)

type ProjectController struct {
	projectService *service.ProjectService
}

func NewProjectController() *ProjectController {
	_projectService := service.NewProjectService()
	return &ProjectController{projectService: _projectService}
}

// CreateProject 创建项目接口
// @Summary 创建项目
// @Tags 项目管理
// @Description 创建一个新的项目
// @Accept json
// @Produce json
// @Param project body model.Project true "项目对象"
// @Success 201 {object} utils.Response
// @Failure 400 {object} utils.Response
// @Failure 500 {object} utils.Response
// @Router /project [post]
func (pc *ProjectController) CreateProject(c *gin.Context) {
	var project model.Project
	if err := c.ShouldBindJSON(&project); err != nil {
		c.JSON(http.StatusBadRequest, utils.NewBuilder().Error(err.Error()).Build())
		return
	}
	err := pc.projectService.CreateProject(&project)
	if err != nil {
		c.JSON(http.StatusInternalServerError, utils.NewBuilder().Error(err.Error()).Build())
		return
	}
	c.JSON(http.StatusCreated, utils.NewBuilder().Success(project).Build())
}

// StartScan 根据IP或IP段开始扫描
// @Summary 根据IP或IP段开始扫描
// @Description 根据IP或IP段开始扫描
// @Tags 项目管理
// @Produce json
// @Param cidr query string true "IP地址或网段"
// @Success 200 {object} utils.Response "成功返回项目ID"
// @Failure 500 {object} utils.Response "服务器内部错误"
// @Router /project/start [get]
func (pc *ProjectController) StartScan(c *gin.Context) {
	// 解析分页参数
	cidr := c.Query("cidr")
	log.Print("cidr:", cidr)
	project, err := pc.projectService.StartScan(cidr)
	if err != nil {
		c.JSON(http.StatusInternalServerError, utils.NewBuilder().Error(err.Error()).Build())
	}
	c.JSON(http.StatusOK, utils.NewBuilder().Success(project).Build())
}

// GetProjectById 获取项目接口
// @Tags 项目管理
// @Summary 获取项目
// @Description 根据ID获取项目
// @Produce json
// @Param id path int true "项目ID"
// @Success 200 {object} utils.Response
// @Failure 400 {object} utils.Response
// @Failure 404 {object} utils.Response
// @Router /project/{id} [get]
func (pc *ProjectController) GetProjectById(c *gin.Context) {
	idStr := c.Param("id")
	id, err := strconv.Atoi(idStr)
	if err != nil {
		c.JSON(http.StatusBadRequest, utils.NewBuilder().Error("无效的项目ID").Build())
		return
	}
	project, err := pc.projectService.GetProjectByID(uint(id))
	if err != nil {
		c.JSON(http.StatusNotFound, utils.NewBuilder().Error("项目未找到").Build())
		return
	}
	c.JSON(http.StatusOK, utils.NewBuilder().Success(project).Build())
}

// GetAllProjects 获取所有项目列表
// @Tags 项目管理
// @Summary 获取所有项目
// @Description 获取所有项目列表，支持分页查询
// @Produce json
// @Param page query int false "页码" default(1)
// @Param page_size query int false "每页数量" default(10)
// @Success 200 {object} utils.Response "成功返回分页的项目列表"
// @Failure 500 {object} utils.Response "服务器内部错误"
// @Router /project [get]
func (pc *ProjectController) GetAllProjects(c *gin.Context) {
	// 解析分页参数
	page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
	pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "10"))

	results, err := pc.projectService.GetPaginatedProjects(page, pageSize)
	if err != nil {
		c.JSON(http.StatusInternalServerError, utils.NewBuilder().Error(err.Error()).Build())
		return
	}

	c.JSON(http.StatusOK, utils.NewBuilder().Success(results).Build())
}

// UpdateProject 更新项目接口
// @Tags 项目管理
// @Summary 更新项目
// @Description 更新指定ID的项目
// @Accept json
// @Produce json
// @Param id path int true "项目ID"
// @Param project body model.Project true "项目对象"
// @Success 200 {object} utils.Response
// @Failure 400 {object} utils.Response
// @Failure 404 {object} utils.Response
// @Router /project/{id} [put]
func (pc *ProjectController) UpdateProject(c *gin.Context) {
	idStr := c.Param("id")
	id, err := strconv.Atoi(idStr)
	if err != nil {
		c.JSON(http.StatusBadRequest, utils.NewBuilder().Error("无效的项目ID").Build())
		return
	}
	var project model.Project
	if err := c.ShouldBindJSON(&project); err != nil {
		c.JSON(http.StatusBadRequest, utils.NewBuilder().Error(err.Error()).Build())
		return
	}
	project.ID = uint(id)
	err = pc.projectService.UpdateProject(&project)
	if err != nil {
		c.JSON(http.StatusNotFound, utils.NewBuilder().Error("项目未找到").Build())
		return
	}
	c.JSON(http.StatusOK, utils.NewBuilder().Success(project).Build())
}

// DeleteProject 删除项目接口
// @Tags 项目管理
// @Summary 删除项目
// @Description 根据ID删除项目
// @Param id path int true "项目ID"
// @Success 204 {object} utils.Response
// @Failure 400 {object} utils.Response
// @Failure 404 {object} utils.Response
// @Router /project/{id} [delete]
func (pc *ProjectController) DeleteProject(c *gin.Context) {
	idStr := c.Param("id")
	id, err := strconv.Atoi(idStr)
	if err != nil {
		c.JSON(http.StatusBadRequest, utils.NewBuilder().Error("无效的项目ID").Build())
		return
	}
	err = pc.projectService.DeleteProject(uint(id))
	if err != nil {
		c.JSON(http.StatusNotFound, utils.NewBuilder().Error("项目未找到").Build())
		return
	}
	c.JSON(http.StatusNoContent, utils.NewBuilder().Success(nil).Build())
}

// UpdateProjectStatus 更新项目状态
// @Tags 项目管理
// @Summary 更新项目状态
// @Description 更新指定ID的项目状态
// @Accept json
// @Produce json
// @Param id path int true "项目ID"
// @Param status query int true "项目状态(0:扫描中 1:已完成)"
// @Success 200 {object} utils.Response
// @Failure 400 {object} utils.Response
// @Failure 404 {object} utils.Response
// @Router /project/{id}/status [put]
func (pc *ProjectController) UpdateProjectStatus(c *gin.Context) {
	idStr := c.Param("id")
	id, err := strconv.Atoi(idStr)
	if err != nil {
		c.JSON(http.StatusBadRequest, utils.NewBuilder().Error("无效的项目ID").Build())
		return
	}

	statusStr := c.Query("status")
	status, err := strconv.Atoi(statusStr)
	if err != nil || (status != 0 && status != 1) {
		c.JSON(http.StatusBadRequest, utils.NewBuilder().Error("无效的状态值，必须为0或1").Build())
		return
	}

	err = pc.projectService.UpdateProjectStatus(uint(id), status, 0)
	if err != nil {
		c.JSON(http.StatusNotFound, utils.NewBuilder().Error(err.Error()).Build())
		return
	}
	c.JSON(http.StatusOK, utils.NewBuilder().Success(nil).Build())
}
